// import { Deriction as x } from "./练习/Deriction"

//6. tuple
// 元组 (Tuple) 是⼀种特殊的数组类型，可以存储固定数量的元素，并且每个元素的类型是已
// 知的且可以不同。元组⽤于精确描述⼀组值的类型， ? 表示可选元素。
// 第⼀个元素必须是 string 类型，第⼆个元素必须是 number 类型。
let tuple_arr1: [string, number]
// 第⼀个元素必须是 number 类型，第⼆个元素是可选的，如果存在，必须是 boolean 类型。
let tuple_arr2: [number, boolean?]
// 第⼀个元素必须是 number 类型，后⾯的元素可以是任意数量的 string 类型
let tuple_arr3: [number, ...string[]]

// 可以赋值
tuple_arr1 = ['hello', 123]
tuple_arr2 = [100, false]
tuple_arr2 = [200]
tuple_arr3 = [100, 'hello', 'world']
// console.log(...tuple_arr3)
tuple_arr3 = [100]





//7. enum
//枚举（ enum ）可以定义⼀组命名常量，它能增强代码的可读性，也让代码更好维护。
// 如下代码的功能是：根据调⽤ walk 时传⼊的不同参数，执⾏不同的逻辑，存在的问题是调⽤ 
// walk 时传参时没有任何提示，编码者很容易写错字符串内容；并且⽤于判断逻辑的 up 、 
// down 、 left 、 right 是连续且相关的⼀组值，那此时就特别适合使⽤ 枚举（ enum ）。

//1. 数字枚举
//数字枚举⼀种最常⻅的枚举类型，其成员的值会⾃动递增，且数字枚举还具备反向映射的
// 特点，在下⾯代码的打印中，不难发现：可以通过值来获取对应的枚举成员名称 。
enum Deriction {
    //也可以指定枚举成员的初始值，其后的成员值会⾃动递增。
    Up = 6,
    Down,
    Left,
    Right
}

//使⽤数字枚举完成刚才 walk 函数中的逻辑，此时我们发现： 代码更加直观易读，⽽且类型安全，同时也更易于维护
function walk(data: Deriction) {
    if (data === Deriction.Up) {
        console.log("向【上】⾛");
    } else if (data === Deriction.Down) {
        console.log("向【下】⾛");
    } else if (data === Deriction.Left) {
        console.log("向【左】⾛");
    } else if (data === Deriction.Right) {
        console.log("向【右】⾛");
    } else {
        console.log("未知⽅向");
    }
}
walk(Deriction.Down)
walk(Deriction.Left)
walk(Deriction.Right)
walk(Deriction.Up)

// 反向映射
console.log(Deriction.Up)
console.log(Deriction[6])
console.log(Deriction.Up); // 输出: 6
console.log(Deriction.Down); // 输出: 7
console.log(Deriction)

//2. 字符串枚举
//枚举成员的值是字符串
enum Deriction2 {
    Up = "up",
    Down = "down",
    Left = "left",
    Right = "right"
}
console.log(Deriction2.Down)

//3. 常量枚举
// 官⽅描述：常量枚举是⼀种特殊枚举类型，它使⽤ const 关键字定义，在编译时会被内联，避免⽣成⼀些额外的代码。
// 何为编译时内联？
// 所谓“内联”其实就是 TypeScript 在编译时，会将枚举成员引⽤替换为它们的实际值，
// ⽽不是⽣成额外的枚举对象。这可以减少⽣成的 JavaScript 代码量，并提⾼运⾏时性
// 能。
//使⽤普通枚举的 TypeScript 代码如下：
enum Directions {
    Up,
    Down,
    Left,
    Right
}
let dir_x = Directions.Up
console.log(Directions.Up)

// 编译后⽣成的 JavaScript 代码量较⼤ ：
// "use strict";
// var Directions;
// (function (Directions) {
//  Directions[Directions["Up"] = 0] = "Up";
//  Directions[Directions["Down"] = 1] = "Down";
//  Directions[Directions["Left"] = 2] = "Left";
//  Directions[Directions["Right"] = 3] = "Right";
// })(Directions || (Directions = {}));
// let x = Directions.Up;

// 使⽤常量枚举的 TypeScript 代码如下：
const enum Directions2 {
    Up,
    Down,
    Left,
    Right
}
let Directions2_x = Directions2.Up;
// 编译后⽣成的 JavaScript 代码量较⼩：
// let Directions2_x = 0 /* Directions.Up */;






